剑指 Offer 32 - II. 从上到下打印二叉树 II

题目描述

从上到下按层打印二叉树,同一层的节点按从左到右的顺序打印,每一层打印到一行。

例如:
给定二叉树: $[3,9,20,null,null,15,7]$,

1
2
3
4
5
  3
/ \
9 20
/ \
15 7

返回其层次遍历结果:

1
2
3
4
5
[
[3],
[9,20],
[15,7]
]

提示:

  1. $节点总数 <= 1000$

注意:本题与主站 102 题相同:https://leetcode-cn.com/problems/binary-tree-level-order-traversal/


算法

(BFS,层序遍历) $O(n)$

使用宽度优先搜索配合队列层序遍历二叉树

  1. 首先先将根节点入队列
  2. 如果队列不为空,进行以下循环
  3. 计算当前队列中的元素个数 sz,即当前层的元素个数
  4. 遍历当前层的每个元素,每次弹出队头元素,并将其对应的值加入到当前层序列中,如果当前节点有左孩子,则将左孩子入队列,如果当前节点有右孩子,则将右孩子入队列,代表下一层节点。
  5. 遍历完一层将当前层序列添加到答案中。

时间复杂度

二叉树的每个节点只会被遍历一次,所以时间复杂度为 $O(n)$。

空间复杂度

存储答案需要额外 $O(n^2)$ 的空间,队列需要额外 $O(n)$ 的空间。

C++ 代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
/**
* Definition for a binary tree node.
* struct TreeNode {
* int val;
* TreeNode *left;
* TreeNode *right;
* TreeNode(int x) : val(x), left(NULL), right(NULL) {}
* };
*/
class Solution {
public:
vector<vector<int>> levelOrder(TreeNode* root) {
vector<vector<int>> ans;
queue<TreeNode*> q;

if (root) q.push(root);

while (q.size()) {
int sz = q.size();
vector<int> line;
while (sz -- ) {
auto t = q.front();
q.pop();

line.push_back(t->val);
if (t->left) q.push(t->left);
if (t->right) q.push(t->right);
}
ans.push_back(line);
}

return ans;
}
};
Author: tonngw
Link: https://tonngw.com/2022/07/08/剑指 Offer/剑指 Offer 32 - II. 从上到下打印二叉树 II/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.